package nexus.align
{
	import flash.utils.Dictionary;
	
	/**
	 * IA 경로   : common - winnie <br>
	 * 설명         : <br>
	 * 최초 작성  : 김정환D - Xprime <br> 
	 * 수정         : <br>  
	 */
	public class AlignFactory
	{
		/**
		 * 가로정렬 
		 */		
		public static const TYPE_HORIZONTAL : String = "alignTypeHorizontal";
		
		/**
		 * 세로정렬 
		 */		
		public static const TYPE_VERTICAL : String = "alignTypeVertical";
		
		
		
		
		
		
		
		// 기본 정렬박스 1개
		private var _alignBox : BaseAlignBox;
		
		// 기본 셀 사이즈 - _minCellSizeList를 추가하지 않을 경우 기본셀 사이즈가 등록됨.
		private var _defaultCellSize : Number = 0;
		
		
		// 기본 타입.
		private var _defaultType : String = "alignTypeVertical";
		
		
		
		
		
		
		/**
		 * @param _type 최초 정렬 타입 -  AlignFactory.TYPE_HORIZONTAL , AlignFactory.TYPE_VERTICAL
		 * @param __cellNum - 셀 갯수
		 * @param __minCellSizeList - 셀 크기 배열 ( 갯수와 동일해야 함 ) , 값이 null 일 경우 defaultCellSize 가 정의되어 있어야 한다.
		 * @param __alignList - 최초 정렬 타입에 따른 각 셀별 정렬 리스트 ( 기본 - 왼쪽 및 위쪽 ) 
		 */		
		public function AlignFactory( __cellNum : int = 0, 
									  __minCellSizeList :Array = null,  
									  _type : String = "alignTypeVertical", 
									  __alignList : Array = null )
		{
			if( __minCellSizeList == null ) __minCellSizeList = [];
			if( __cellNum > __minCellSizeList.length )
			{
				var len : int = __cellNum - __minCellSizeList.length;
				for( var i:int = 0; i<len; i++ )
				{
					__minCellSizeList.push( _defaultCellSize );
				}
			}
			
			_defaultType = _type;
			
			if( _type == TYPE_HORIZONTAL )
			{
				_alignBox = new AlignHBox(__cellNum, __minCellSizeList, __alignList );
			}
			else
			{
				_alignBox = new AlignVBox( __cellNum, __minCellSizeList, __alignList );
			}
		}
		
		
		
		/**
		 * @param __x 기본 x 좌표
		 * @param __y 기본 y 좌표
		 * @return 
		 */		
		public function setPosition( __x : Number, __y :Number ):AlignFactory
		{
			_alignBox.x = __x;
			_alignBox.y = __y;
			
			return this;
		}
		
		
		/**
		 * @param list DisplayObject 배열
		 * @return AlignFactory
		 */		
		public function addSimpleList( list : Array ):AlignFactory
		{
			var len : int = list.length;
			for( var i:int = 0; i<len; i++ )
			{
				var ao : AlignObject = new AlignObject( list[i], null, new AlignInfo() );
				_alignBox.addItem( ao ); 
			}
			
			return this;
		}
		
		/**
		 * 
		 * @param item DisplayObject
		 * @param padding 시계방향 패딩값 ( length 상관없이 삽입가능 )
		 * @return AlignFactory
		 * 
		 */		
		public function addSimpleItem( item:Object = null, padding:Array=null ):AlignFactory
		{
			var ao : AlignObject = new AlignObject( item, null, new AlignInfo(padding) );
			this._alignBox.addItem( ao );
			return this;
		}
		
		/**
		 * @param box BaseAlignBox
		 * @param padding 시계방향 패딩값 ( length 상관없이 삽입가능 )
		 * @return AlignFactory
		 * 
		 */		
		public function addSimpleBox( box:BaseAlignBox=null, padding:Array=null ):AlignFactory
		{
			var ao : AlignObject = new AlignObject( null, box, new AlignInfo(padding) );
			this._alignBox.addItem( ao );
			return this;
		}
		
		
		/**
		 * @param _cellSize 새로 삽입할 셀의 크기 ( 가로 또는 세로 1가지만 )
		 * @param item DisplayObject 
		 * @param box BaseAlignBox 
		 * @return AlignFactory
		 */		
		public function addCellAndItem( item : Object = null , box : BaseAlignBox = null, _cellSize : Number = 0 ):AlignFactory
		{
			_alignBox.cellNum++;
			(_cellSize == 0 ) ? _alignBox.minCellSize.push( _defaultCellSize ) : _alignBox.minCellSize.push( _cellSize );
			
			var ao : AlignObject = new AlignObject( item, box, new AlignInfo() );
			_alignBox.addItem( ao ); 
			
			return this;
		}
		
		/**
		 * @param _cellSize 셀 1칸만 늘릴경우, 값이 없으면 defaultCellSize로 등록된다.
		 * @return AlignFactory
		 */		
		public function addCell( _cellSize : Number=0 ):AlignFactory
		{
			_alignBox.minCellSize.push( _cellSize );
			_alignBox.cellNum++;
			
			return this;
		}
		
		/**
		 * 
		 * @param obj AlignObject 
		 * @return AlignFactory
		 * 
		 */		
		public function addAlignObject( obj : AlignObject ):AlignFactory
		{
			_alignBox.addItem( obj );
			return this;
		}
		
		
		/**
		 * @param obj : AlignObject
		 * @param idx : int
		 * @return AlignFactory
		 */		
		public function addAlignObjectAt( obj:AlignObject, idx:int ):AlignFactory
		{
			_alignBox.addItemAt( obj, idx );
			
			return this;
		}
		
		
		
		
		/**
		 * @param size 기본이 되는 셀 사이즈 정의
		 * @return AlignFactory
		 */		
		public function  setDefaultCellSize( size:Number ):AlignFactory
		{
			this._defaultCellSize = size;
			
			var len : int = _alignBox.minCellSize.length;
			for( var i:int = 0; i<len; i++ )
			{
				if( _alignBox.minCellSize[ i ] == 0 )
				{
					_alignBox.minCellSize[ i ] = _defaultCellSize;
				}
			}
			
			return this;
		}
		
		
		
		/**
		 * 정렬 가동 메서드 
		 */		
		public function workingAlign():void
		{
			this._alignBox.workingAlign();
		}
		
		
		
		
		
		/**
		 * @return 기본 정렬박스 반환
		 */		
		public function get defaultAlignBox():BaseAlignBox
		{
			return this._alignBox;
		}
		
		
		/**
		 * @return 셀 갯수 반환
		 */		
		public function get cellLength():int
		{
			return _alignBox.cellNum;
		}
		
		/**
		 * @return 셀 기본 사이즈 배열의 길이 반환
		 */		
		public function get cellSizeListLength():int
		{
			return _alignBox.minCellSize.length;
		}
		
		/**
		 * @return _defaultCellSize;
		 */		
		public function get defaultCellSize():Number
		{
			return _defaultCellSize;
		}
		
		/**
		 * @param _x 
		 */		
		public function set x( _x : Number ):void
		{
			_alignBox.x = _x;
		}
		
		/**
		 * @param _y 
		 */		
		public function set y( _y : Number ):void
		{
			_alignBox.y = _y;
		}
		
		/**
		 * @param _x 
		 */		
		public function get x():Number
		{
			return _alignBox.x;
		}
		
		/**
		 * @param _y 
		 */		
		public function get y():Number
		{
			return _alignBox.y;
		}
		
		
		
		/**
		 * @param initX
		 * @param initY
		 * @param __cellNum
		 * @param __minCellSizeList
		 * @param _type
		 * @param __alignList
		 * @return AlignFactory
		 */		
		public function init( initX : Number = 0, 
							  initY : Number = 0, 
							  __cellNum : int = 0, 
							  __minCellSizeList :Array = null,  
							  _type : String = "alignTypeVertical", 
							  __alignList : Array = null ):AlignFactory
		{
			this.destroy();
			
			if( _type == TYPE_HORIZONTAL )
			{
				_alignBox = new AlignHBox(__cellNum, __minCellSizeList, __alignList );
			}
			else
			{
				_alignBox = new AlignVBox( __cellNum, __minCellSizeList, __alignList );
			}
			
			_defaultType = _type;
			
			_alignBox.x = initX;
			_alignBox.y = initY;
			
			return this;
		}
		
		
		/**
		 * item 의 높이만큼 기본 셀을 추가하며, 아이템을 추가.
		 * <br>
		 * _af.init( 300, 200 );
		 _af.add( _mc, [0,0,0,0] );
		 _af.addBox( new AlignHBox(1,[200],[Align.RIGHT]).addSimpleItem( _mc2, [0,0,0,0] ));
		 //			_af.addBox( new AlignHBox(2,[150, 50],[Align.RIGHT,Align.RIGHT]).addSimpleItem( _mc1, [0,0,0,0] ),.addSimpleItem( _mc2, [0,0,0,0] ));
		 _af.add( _mc3, [0,0,0,0] );
		 _af.add( _mc4, [0,0,0,0] );
		 _af.add( _mc5, [0,0,0,0] );
		 _af.workingAlign();
		 * @param item
		 * @param padding
		 * @return  AlignFactory
		 */		
		public function add( item : Object, padding : Array = null ):AlignFactory
		{
			if( _defaultType == TYPE_HORIZONTAL )
			{
				addCell( item.width + ( padding ? padding[1]+padding[3] : 0 ) );
			}
			else
			{
				addCell( item.height + ( padding ? padding[0]+padding[2] : 0 ) );
			}
			
			addSimpleItem( item, padding );
			return this;
		}
		
		
		public function addBox(box:BaseAlignBox=null, padding:Array=null):AlignFactory
		{
			if( _defaultType == TYPE_HORIZONTAL )
			{
				addCell( box.widthMeasured );
			}
			else
			{
				addCell( box.heightMeasured );
			}
			addSimpleBox( box, padding );
			
			return this;
		}
		
		
		
		
		/**
		 * 초기화 메서드 
		 */		
		public function destroy():void
		{
			_alignBox.destory();
			_alignBox = null;
			_defaultCellSize = -1;
		}
	}
}

















